//相关资料 https://zhuanlan.zhihu.com/p/27471300

#include<initializer_list>
#include<cmath>
//四元数
//与旋转有关的地方应该会用到
struct quaternion{
	using num=double;
	//它是惟一的实数
	num w=0;
	//一般用来表示虚部
	num x=0,y=0,z=0;
	//四元数的绝对值是四元数到原点的距离
	num mod();
	//获得共轭
	quaternion conjugate();
};

#pragma region operators 
quaternion operator+(const quaternion& a,const quaternion& b);
quaternion operator-(const quaternion& a,const quaternion& b);
quaternion operator-(const quaternion& a);
quaternion operator+(const quaternion& a,quaternion::num b);
quaternion operator+(quaternion::num b,const quaternion& a);
quaternion operator-(const quaternion& a,quaternion::num b);
quaternion operator-(quaternion::num b,const quaternion& a);
//注意,四元数的乘法运算不遵循交换律
quaternion operator*(const quaternion& a,const quaternion& b);
quaternion operator*(const quaternion& a,quaternion::num b);
quaternion operator*(quaternion::num b,const quaternion& a);
#pragma endregion
//点积,不同于一般的乘法
quaternion dot(const quaternion& a,const quaternion& b);

	// quaternion(num _w=0,num _x=0,num _y=0,num _z=0);
	// quaternion(std::initializer_list<num> in);
	// quaternion(num re);

